package com.smartandroid.sa.floatextview;

import java.util.ArrayList;

/**
 * Created by Dean on 24/06/2014.
 */
public class CollisionHelper {

	// static for performance
	// this method is being smashed multiple times in onDraw sequences
	// we don't want these to be instatianted for every call to
	// calculateLineSpaceForGivenYOffset, we'll just reuse them
	private final static ArrayList<Area> mAreas = new ArrayList<Area>();

	public static Line calculateLineSpaceForGivenYOffset(float lineYbottom,
			int lineHeight, float viewWidth, ArrayList<Obstacle> obstacles) {

		Line line = new Line();
		line.leftBound = 0;
		line.rightBound = viewWidth;

		float lineYtop = lineYbottom - lineHeight;
		mAreas.clear();

		for (Obstacle obstacle : obstacles) {

			if (obstacle.topLefty > lineYbottom
					|| obstacle.bottomRighty < lineYtop) {

			} else {

				Area leftArea = new Area();
				leftArea.x1 = 0;

				for (Obstacle innerObstacle : obstacles) {
					if (innerObstacle.topLefty > lineYbottom
							|| innerObstacle.bottomRighty < lineYtop) {

					} else {
						if (innerObstacle.topLeftx < obstacle.topLeftx) {
							leftArea.x1 = innerObstacle.bottomRightx;
						}
					}
				}

				leftArea.x2 = obstacle.topLeftx;
				leftArea.width = leftArea.x2 - leftArea.x1;

				Area rightArea = new Area();
				rightArea.x1 = obstacle.bottomRightx;
				rightArea.x2 = viewWidth;

				for (Obstacle innerObstacle : obstacles) {
					if (innerObstacle.topLefty > lineYbottom
							|| innerObstacle.bottomRighty < lineYtop) {

					} else {
						if (innerObstacle.bottomRightx > obstacle.bottomRightx) {
							rightArea.x2 = innerObstacle.topLeftx;
						}
					}
				}

				rightArea.width = rightArea.x2 - rightArea.x1;

				mAreas.add(leftArea);
				mAreas.add(rightArea);
			}
		}
		Area mLargestArea = null;

		if (mAreas.size() > 0) { // if there is no areas then the whole line is
									// clear, if there is areas, return the
									// largest (it means there is one or more
									// boxes colliding with this line)
			for (Area area : mAreas) {
				if (mLargestArea == null) {
					mLargestArea = area;
				} else {
					if (area.width > mLargestArea.width) {
						mLargestArea = area;
					}
				}
			}

			line.leftBound = mLargestArea.x1;
			line.rightBound = mLargestArea.x2;
		}

		return line;
	}
}
